﻿Namespace Objects

    ''' <summary>
    ''' Totaal van bedragen met dezelfde btw-voet
    ''' </summary>
    Public Class BtwTotaal

        Public BtwPercentage As Decimal
        Public TotaalMetBtw As Decimal

        Public ReadOnly Property TotaalZonderBtw() As Decimal
            Get
                Return TotaalMetBtw - Btw
            End Get
        End Property

        Public ReadOnly Property Btw() As Decimal
            Get
                Return TotaalMetBtw * BtwPercentage / (100D + BtwPercentage)
            End Get
        End Property

        Public Sub New(ByVal percentage As Single, ByVal bedragInclusief As Decimal)
            BtwPercentage = Convert.ToDecimal(percentage)
            TotaalMetBtw = bedragInclusief
        End Sub

    End Class

    ''' <summary>
    ''' Lijst van totalen van de bedragen binnen een verkoop met dezelfde btw-voet
    ''' </summary>
    Public Class BtwTotalen
        Inherits SortedDictionary(Of Single, BtwTotaal)

        Private _totaalCheques As Decimal = 0D
        Private _totaalLeeggoed As Decimal = 0D

        Public ReadOnly Property TotaalCheques() As Decimal
            Get
                Return _totaalCheques
            End Get
        End Property

        Public ReadOnly Property TotaalLeeggoed() As Decimal
            Get
                Return _totaalLeeggoed
            End Get
        End Property

        Public ReadOnly Property TotaalLeeggoedEnCheques() As Decimal
            Get
                Return _totaalLeeggoed + _totaalCheques
            End Get
        End Property

        ''' <summary>
        ''' Totaalbedrag met het leeggoed en de cheques.
        ''' </summary>
        ''' <returns></returns>
        Public ReadOnly Property TotaalMetLeeggoedEnCheques() As Decimal
            Get
                Dim totaal As Decimal = 0
                For Each item As BtwTotaal In Values
                    totaal += item.TotaalMetBtw
                Next
                Return totaal
            End Get
        End Property

        ''' <summary>
        ''' Totaalbedrag zonder het leeggoed en de cheques.
        ''' </summary>
        ''' <returns></returns>
        Public ReadOnly Property TotaalZonderLeeggoedEnCheques() As Decimal
            Get
                Return TotaalMetLeeggoedEnCheques() - TotaalLeeggoedEnCheques()
            End Get
        End Property

        Public Sub VoegDetailToe(ByVal detail As VerkoopsDetail)
            VoegToeAanTotaal(detail.BTW, detail.TotaalPrijsZonderStatiegeld)
            If (detail.TotaalAfTeDrukkenStatiegeld <> 0) Then
                ' leeggoed nog boeken onder 0% BTW
                ' dit is zowel leeggoed apart als leeggoed inbegrepen in artikel
                VoegToeAanTotaal(0S, detail.TotaalAfTeDrukkenStatiegeld)
                _totaalLeeggoed += detail.TotaalAfTeDrukkenStatiegeld
            End If
            If (detail.IsCheque) Then
                If (Not detail.BTW = 0S AndAlso detail.DataRow IsNot Nothing AndAlso detail.DataRow.ArtikelsRow IsNot Nothing) Then
                    log.WriteInfo("Fout in artikels gevonden: artikel {0} is cheque, maar BTW is niet 0% maar {1}%!", detail.DataRow.ArtikelsRow.Id, detail.BTW)
                End If
                _totaalCheques += detail.TotaalPrijsZonderStatiegeld
            End If
        End Sub

        ''' <summary>
        ''' Haal het totaal op met een bepaald percentage. 
        ''' Gebruik deze methode als je niet op voorhand zeker bent of er wel altijd waarden in de lijst zitten met dat percentage.
        ''' </summary>
        Public Function BtwMetPercentage(ByVal percentage As Single) As BtwTotaal
            If (ContainsKey(percentage)) Then
                Return Me.Item(percentage)
            Else
                Return New BtwTotaal(percentage, 0D)
            End If
        End Function

        Public Overloads Sub Clear()
            MyBase.Clear()
            _totaalCheques = 0D
            _totaalLeeggoed = 0D
        End Sub

        Private Sub VoegToeAanTotaal(ByVal percentage As Single, ByVal bedragInclusief As Decimal)
            If (ContainsKey(percentage)) Then
                Me.Item(percentage).TotaalMetBtw += bedragInclusief
            Else
                Dim totaal As New BtwTotaal(percentage, bedragInclusief)
                Add(percentage, totaal)
            End If
        End Sub

    End Class

End Namespace
